package com.test.case5;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.atomic.AtomicLong;

/**
 * @Author:wyf
 * @Description:CountDownLatch可以使一个获多个线程等待其他线程各自执行完毕后再执行。
 *
 *
 *
 * CountDownLatch 定义了一个计数器，和一个阻塞队列， 当计数器的值递减为0之前，阻塞队列里面的线程处于挂起状态，
 * 当计数器递减到0时会唤醒阻塞队列所有线程，这里的计数器是一个标志，可以表示一个任务一个线程，也可以表示一个倒计时器，
 * CountDownLatch可以解决那些一个或者多个线程在执行之前必须依赖于某些必要的前提业务先执行的场景。
 * @Date:Created in 13:16 2021/6/29
 * @Modified By:
 */
public class Counter7 {
    static AtomicLong count = new AtomicLong(0);

    public static void incr() {
        count.incrementAndGet();
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        for (int i = 0; i < 10; i++) {
            count.set(0);
            count();
        }
    }

    private static void count() throws InterruptedException {
        long t1 = System.currentTimeMillis();
        int threadCount = 1000;
        //构造方法，创建一个值为1000 的计数器。
        CountDownLatch countDownLatch = new CountDownLatch(threadCount);
        for (int i = 0; i < threadCount; i++) {
            new Thread(() -> {
                try {
                    for (int j = 0; j < 100000; j++) {
                        incr();//累加
                    }
                } finally {
                    countDownLatch.countDown();//countDown();//对计数器进行递减1操作，当计数器递减至0时，当前线程会去唤醒阻塞队列里的所有线程。
                }
            }).start();
        }
        countDownLatch.await();//阻塞当前线程，将当前线程加入阻塞队列。
        long t2 = System.currentTimeMillis();
        System.out.println("Counter7, "+String.format("结果：%s,耗时(ms)：%s", count, (t2 - t1)));
    }
}
